package tool.classloader;

import java.io.File;
import java.io.FilenameFilter;

/**rappresenta un particolare filtro che riesce ad filtrare cartelle e file con una certa estensione.
 * La classe è compatibile sia con JFileChooser che con java.io.File
 * 
 * @author koldar
 * @version 1.2
 */
public class FileSystemFilter extends javax.swing.filechooser.FileFilter implements FilenameFilter,java.io.FileFilter{

	/**indica se le directory vengono accettate dal filtro (TRUE) oppure scartate (FALSE)*/
	private boolean directoryAllowed;
	/**indica la descrizione del filtro. richiamabile tramite toString()*/
	private String description;
	/**indica la lista delle estensioni accettate*/
	private String[] extensionAllowed;
	/**indica la lista (in formato espressione regolare) delle estensioni accettate*/
	private String extensionAllowedRegex;
	
	public FileSystemFilter(boolean directoryAllowed,String _description,String ..._extensionAllowed){
		this.directoryAllowed=directoryAllowed;
		this.description=_description;
		this.extensionAllowed=_extensionAllowed;
		this.extensionAllowedRegex=".+\\.(";
		for (int i=0;i<this.extensionAllowed.length;i++){
			this.extensionAllowedRegex=this.extensionAllowedRegex+this.extensionAllowed[i]+((i+1)==this.extensionAllowed.length?"":"|");
		}
		this.extensionAllowedRegex=this.extensionAllowedRegex+")";
	}
	
	@Override
	public boolean accept(File dir, String name) {
		return this.accept(new File(dir.getAbsolutePath()+"\\"+name));
	}

	@Override
	public boolean accept(File f) {
		return (
				((f.isDirectory())&&(this.directoryAllowed))||//il file è una directory e le directory sono ben accette
				((f.isFile())&&(f.getName().matches(extensionAllowedRegex)))//il file è un file ed ha un estensione accettata
			);
	}

	@Override
	public String getDescription() {
		return this.description;
	}
	public String toString(){
		return this.description;
	}

	/**
	 * @return the directoryAllowed
	 */
	public boolean isDirectoryAllowed() {
		return directoryAllowed;
	}

	/**
	 * @param directoryAllowed the directoryAllowed to set
	 */
	public void setDirectoryAllowed(boolean directoryAllowed) {
		this.directoryAllowed = directoryAllowed;
	}

	/**
	 * @return the extensionAllowed
	 */
	public String[] getExtensionAllowed() {
		return extensionAllowed;
	}

	/**
	 * @return the extensionAllowedRegex
	 */
	public String getExtensionAllowedRegex() {
		return extensionAllowedRegex;
	}

	/**
	 * @param description the description to set
	 */
	public void setDescription(String description) {
		this.description = description;
	}
	

}
